#include "VistaDeMapa.h"

VistaDeMapa::VistaDeMapa(Mapa* _mapa) : mapa(_mapa)
{
	// TODO: Elegir si es posible y necesario un mejor default value
	centro_de_la_vista = Punto(0,0);
}

void VistaDeMapa::CentrarEn(const Punto& posicion)
{
	centro_de_la_vista = posicion;
}

void VistaDeMapa::Dibujar(SDL_Surface* superficie)
{
	int tilesize = 50;

	int ii = centro_de_la_vista.Y()/tilesize;
	int jj = centro_de_la_vista.X()/tilesize;

	//SDL_Surface* src = mapa->Tile(ii,jj).Superficie();

	//SDL_Rect offset;
	//offset.x = superficie->w/2 - tilesize/2;
	//offset.y = superficie->h/2 - tilesize/2;
	//cout << src->w << endl;
	//SDL_BlitSurface( mapa->Tile(ii,jj).Superficie() , 0 , superficie , &offset );
	//Copiar(src,superficie,&offset);
	//cout << src << endl;

	/*SDL_Rect offset2;
	offset2.x = 0;//superficie->w/2 - tilesize/2;
	offset2.y = 0;//superficie->h/2 - tilesize/2;
	offset2.w = tilesize;
	offset2.h = tilesize;
	cout << src->w << endl;
	SDL_BlitSurface( src , &offset , superficie , 0 );*/


	int j_ini = (centro_de_la_vista.X()-superficie->w/2)/tilesize;
	int i_ini = (centro_de_la_vista.Y()-superficie->h/2)/tilesize;

	int j_fin = (centro_de_la_vista.X()+superficie->w/2)/tilesize;
	int i_fin = (centro_de_la_vista.Y()+superficie->h/2)/tilesize;

	int offset_x = - (centro_de_la_vista.X()-superficie->w/2)%tilesize;
	int offset_y = - (centro_de_la_vista.Y()-superficie->h/2)%tilesize;

	for(int i=i_ini;i<i_fin;i++)
		for(int j=j_ini;j<j_fin;j++)
			if(i>=0 && j>=0) // DEBUG ?
			{
				SDL_Rect offset;
				offset.x = (j-j_ini)*tilesize + offset_x;
				offset.y = (i-i_ini)*tilesize + offset_y;
				//SDL_Surface* src = mapa->VistaDeTile(i,j);
				//cout << src << endl;
				SDL_BlitSurface( mapa->VistaDeTile(i,j) , 0 , superficie , &offset );
			}
		
	//for(int i=0;i<10;i++)
		//for(int j=0;j<10;j++)
			//cout << mapa->Tile(i,j).Superficie() << endl;
		
	/*SDL_Rect offset;
	offset.x = -(posicion.X()-superficie->w/2)%tilesize;
	offset.y = -(posicion.Y()-superficie->h/2)%tilesize;
	SDL_BlitSurface( mapa->Tile(i_ini,j_ini).Superficie() , 0 , superficie , &offset );*/
}


// TODO: Implementar esta funcion y usarla tal vez en las otras funciones como debug
void VistaDeMapa::ValidarPosicion(const Punto& posicion)
{
	
}

// TODO: Fijarse si se puede hacer una funcion de blitting mas optima que la de SDL
/*
void VistaDeMapa::Copiar(SDL_Surface* src,SDL_Surface* dst, SDL_Rect* posicion)
{
	void* src_ptr = src->pixels;
	void* dst_ptr = dst->pixels + 4*(posicion->y*dst->w + posicion->x);
	
	for(int i=0;i<src->h;i++)
	{
		memcpy(dst_ptr,src_ptr,4*src->w);
		dst_ptr += 4*dst->w;
		src_ptr += 4*src->w;
	}
}
*/
